/**********************************************************************************************************************
 * @file    gnss_command.h
 * @author  Queclink Jason.Huang
 * @date    2020-08-31
 * @brief   Queclink FreeRTOS Software Development Kit gnss task source.
 *
 * Copyright (C) 2020 Queclink Wireless Solutions (ShenZhen) Co., Ltd. All Rights Reserved.
 *
 * @attention
 *
 *********************************************************************************************************************/

#ifndef __GNSS_COMMAND_H
#define __GNSS_COMMAND_H
/* includes ---------------------------------------------------------------------------------------------------------*/

/* Macro ------------------------------------------------------------------------------------------------------------*/
#define GNSS_PARAM_LEN		(4)

/* Type----------------------------------------------------------------------------------------------------------------- */
/* GNSS 指令, 每款芯片不一定包含所有, 详见各芯片的指令列表 */
enum {
    GNSS_CMD_AGPS_PRE,              /* 传输 AGPS 数据前的操作 */
    GNSS_CMD_AGPS_POST,             /* 传输 AGPS 数据后的操作 */
    GNSS_CMD_GNSS_MODE_SET,         /* 配置 GNSS mode, 即选择卫星系统(GPS/BeiDou...) */
    GNSS_CMD_ENTER_LOWPOWER,        /* 进入低功耗模式 */
    GNSS_CMD_EXIT_LOWPOWER,         /* 退出低功耗模式 */
    GNSS_CMD_DR_SET,                /* DR 配置 */
    GNSS_CMD_MSG_SET,               /* 数据输入输出配置 */
    GNSS_CMD_PRM_SAVE,              /* 参数保存 */
    GNSS_CMD_JAMMING,               /* 配置干扰检测参数 */
    GNSS_CMD_BAUDRADE,              /* 配置波特率(串口通信时自适应波特率) */
    GNSS_CMD_STATIC_HOLD,           /* 静态保持阈值 */
    GNSS_CMD_NAV_RATE,              /* 定位输出频率 */
    GNSS_CMD_SYSTEM_ON,             /* 启动GNSS系统 */
    GNSS_CMD_CONFIG_DONE,           /* 配置结束,  检查通讯状态,返回初始化结果 */
    GNSS_CMD_GET_AUTH,              /* 获取鉴权信息 */
    GNSS_CMD_CFG_AUTH,              /* 配置鉴权信息 */
    GNSS_CMD_AUTONOMOUS_SEND,       /* 发送自主生成的辅助信息 */
    GNSS_CMD_AUTONOMOUS_QRY,        /* 获取自主生成的辅助信息 */
};

typedef struct {
    int             stage;		/* 执行步骤, 初始化 0 */
    unsigned int    uptime;		/* 初始化 0 */
    void *			ptr;		/* 自由使用的指针,初始化为NULL,命令结束自动释放 */
	int				param[GNSS_PARAM_LEN];
} gnss_cmd_cps;

/* return -EBUSY, 正在执行, 0 执行完毕, others 执行失败 */
typedef int (*gnss_cmd_impl_t)(gnss_cmd_cps *cps);
typedef void (*gnss_cmd_callback)(int cmd_id, int res);

struct gnss_cmd_table_t {
	int			id;		/* 命令 id */
	gnss_cmd_impl_t		impl;	/* 执行函数, Can be NULL */
};

typedef struct {
	int					id;	/* 命令 */
	struct gnss_cmd_table_t  	const* impl;	/* 执行函数 */
	gnss_cmd_callback			callback;		/* 执行结果回调函数 */
	gnss_cmd_cps				cps;	/* 控制参数 */
	struct list_head 			list;
} gnss_cmd_list_t;

void gnss_cmd_del_all(void);

int gnss_cmd_register(int cmd_id, void (*callback)(int cmd_id, int res));

void gnss_cmd_process(void* task_param);

gnss_cmd_list_t *gnss_cmd_get_first(void);

#endif /* __GNSS_COMMAND_H */
